package entry;

import java.util.HashMap;

import javax.annotation.PostConstruct;

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;

import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;

import reactor.core.publisher.Mono;

/**
 * Gateway自定义熔断、降级信息 - 方式一、通过代码的方式
 * 		教程中使用的是"@Configuration"注解、本Demo中使用的是"@Component"注解。
 * 			因为该类并没有配置Bean各种，只是通过"@PostConstruct"注解，达到在容器启动时完成配置的目的。
 * @author libra
 */
@Component
public class GatewayDegradeExConfig {
	
	@PostConstruct
	public void init() {
		// 自定义降级、熔断异常处理实现，该处理只对触发降级、熔断的DegradeException异常有效
		BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
			@Override
			public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {
				HashMap<String,String> map = new HashMap<>() {{
					put("From", "GatewayConfig.BlockRequestHandler");
					put("Msg", "自定义【流控】or【降级、熔断】信息" );
					put("Exception_Type", t.getClass().getSimpleName());
				}};
						// 设置返回的状态码
				return ServerResponse.status( HttpStatus.OK )
						// 设置返回的信息格式
						.contentType( MediaType.APPLICATION_JSON )
						// 设置返回的内容
						.body( BodyInserters.fromValue(map) );
			}
		};
		// 将自定义的降级、熔断DegradeEx异常处理类，通过GatewayCallbackManager进行设置启用
		GatewayCallbackManager.setBlockHandler(blockRequestHandler);
	}

}